Apache CXF এ Interceptors একটি গুরুত্বপূর্ণ উপাদান যা SOAP বা RESTful মেসেজ প্রক্রিয়াকরণের বিভিন্ন ধাপে কাজ করে। এগুলি মেসেজের ইনপুট এবং আউটপুট ফেজে বিভিন্ন ক্রিয়াকলাপ (যেমন: লগিং, অথেন্টিকেশন, এনক্রিপশন, ফল্ট হ্যান্ডলিং) সম্পাদন করতে ব্যবহৃত হয়। বিশেষত detailed logging এর জন্য Interceptors অত্যন্ত কার্যকরী, কারণ এটি ওয়েব সার্ভিসের মেসেজের প্রতিটি ধাপের বিস্তারিত লগ রাখার সুবিধা দেয়।
এখানে, আমরা দেখব কিভাবে Interceptors ব্যবহার করে Apache CXF এ ডিটেইলড লগিং ইমপ্লিমেন্ট করা যায়।
Apache CXF এ Logging করতে হলে আপনাকে InInterceptor এবং OutInterceptor ক্লাস ব্যবহার করতে হবে। এগুলি ইনপুট (request) এবং আউটপুট (response) মেসেজে ইন্টারসেপ্ট করে। এছাড়া আপনি লগিংয়ের জন্য কোনো তৃতীয় পক্ষের লাইব্রেরি (যেমন SLF4J, Log4j) ব্যবহার করতে পারেন।
InInterceptor এবং OutInterceptor এর মাধ্যমে SOAP বা RESTful মেসেজে লগিং করা যাবে। InInterceptor
মেসেজ গ্রহণের আগে এবং OutInterceptor
মেসেজ প্রেরণের আগে কাজ করে।
এখানে একটি কাস্টম ইন্টারসেপ্টর তৈরি করা হয়েছে যা SOAP মেসেজের ইনপুট এবং আউটপুটের বিস্তারিত লগ রাখবে।
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.AbstractPhaseInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggingInterceptor extends AbstractPhaseInterceptor<Message> {
private static final Logger LOG = LoggerFactory.getLogger(LoggingInterceptor.class);
public LoggingInterceptor() {
super(Phase.PRE_INVOKE); // Set the phase in which this interceptor will run
}
@Override
public void handleMessage(Message message) throws Fault {
if (message instanceof SoapMessage) {
SoapMessage soapMessage = (SoapMessage) message;
// Log the incoming message
LOG.info("Incoming SOAP Request: " + soapMessage.toString());
// If you need to log the SOAP body, you can extract and log it here
Object body = soapMessage.getContent(Object.class);
LOG.info("SOAP Body: " + body);
}
}
@Override
public void handleFault(Message message) {
if (message instanceof SoapMessage) {
SoapMessage soapMessage = (SoapMessage) message;
// Log the fault message (if any)
LOG.error("Fault occurred: " + soapMessage.getContent(Exception.class));
}
}
}
এই ইন্টারসেপ্টরটি CXF ওয়েব সার্ভিসে রেজিস্টার করতে হবে, যাতে এটি SOAP মেসেজের ইনপুট এবং আউটপুট লগ করতে পারে।
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.endpoint.ServerImpl;
public class LoggingServer {
public static void main(String[] args) {
HelloWorldImpl implementor = new HelloWorldImpl();
EndpointImpl endpoint = new EndpointImpl(implementor);
// Register the logging interceptor
endpoint.getInInterceptors().add(new LoggingInterceptor());
endpoint.getOutInterceptors().add(new LoggingInterceptor());
// Publish the endpoint
endpoint.publish("http://localhost:8080/helloWorld");
}
}
এখানে, LoggingInterceptor
ইনপুট এবং আউটপুট উভয় ক্ষেত্রেই রেজিস্টার করা হয়েছে। তাই, যখন ক্লায়েন্ট ওয়েব সার্ভিসে রিকোয়েস্ট পাঠাবে, তখন ইনপুট মেসেজ লগ হবে এবং সার্ভার থেকে আউটপুট পাঠানোর আগে তা লগ হবে।
RESTful সার্ভিসে ইন্টারসেপ্টর ব্যবহার করে লগিং করতে হলে, CXF এর InInterceptor
এবং OutInterceptor
ব্যবহার করা যেতে পারে। নিচে একটি উদাহরণ দেখানো হয়েছে:
import org.apache.cxf.jaxrs.ext.MessageContext;
import org.apache.cxf.jaxrs.interceptor.AbstractMessageInterceptor;
import org.apache.cxf.message.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RESTLoggingInterceptor extends AbstractMessageInterceptor<Message> {
private static final Logger LOG = LoggerFactory.getLogger(RESTLoggingInterceptor.class);
public RESTLoggingInterceptor() {
super(Phase.RECEIVE); // Receive phase for inbound messages
}
@Override
public void handleMessage(Message message) {
// Log incoming request URI
String requestURI = (String) message.get(MessageContext.REQUEST_URI);
LOG.info("Incoming REST Request: " + requestURI);
// Log HTTP headers (if necessary)
@SuppressWarnings("unchecked")
Map<String, List<String>> headers = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS);
LOG.info("Request Headers: " + headers.toString());
// Log the request body (for debugging purposes)
String body = (String) message.getContent(String.class);
LOG.info("Request Body: " + body);
}
@Override
public void handleFault(Message message) {
// Log error or fault details
LOG.error("Fault occurred while processing the request.");
}
}
এটি Phase.RECEIVE
তে কাজ করবে, যা ইনপুট মেসেজে লগ রাখা হবে। এখানে ক্লায়েন্টের URI, হেডার, এবং বডি লগ করা হচ্ছে। আপনিও চাইলে আরও বিস্তারিত তথ্য লগ করতে পারেন।
Apache CXF এর লগিং আরও কার্যকরী এবং সহজভাবে পরিচালনা করতে আপনি SLF4J এবং Log4j ব্যবহার করতে পারেন।
Maven প্রজেক্টে SLF4J এবং Log4j ডিপেনডেন্সি যোগ করতে হবে:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
Log4j কনফিগারেশন ফাইল (log4j2.xml
) তৈরির মাধ্যমে লগের স্তর এবং আউটপুট নির্ধারণ করা যায়:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
এটি SLF4J এবং Log4j এর মাধ্যমে লগ সংরক্ষণ এবং কনসোলে প্রদর্শন করতে সাহায্য করবে।
Apache CXF এ Interceptors ব্যবহার করে SOAP এবং RESTful সার্ভিসের ইনপুট এবং আউটপুট মেসেজের বিস্তারিত লগিং করা যেতে পারে। এটি ডিবাগিং এবং সমস্যা সমাধানে সহায়তা করে। SLF4J এবং Log4j এর মাধ্যমে লগিংয়ের আউটপুট কাস্টমাইজ করা যায়, যা উন্নত পর্যায়ের লগিং পরিচালনায় কার্যকরী।
Read more